﻿using System;
using System.Collections.Generic ;
using System.ComponentModel;
using System.Linq;
using System.Windows.Forms;
using LayerEntity.Compras;
using LayerEntity.Persona;
using LayerEntity.Producto ;
using LayerLogic.Compras;
using LayerLogic.Producto;
using LayerEntity.Almacen ;

namespace System2012.Compras
{
    public partial class RegistroComprasDetalle : DevExpress .XtraEditors.XtraForm 
    {
        #region Variables
        ECompra compra;
        LCompras compras = new LCompras(SystemUtils .CurrentConnection);
        List<EDetalleCompra> lista = new List<EDetalleCompra>();
        LProducto pro = new LProducto(SystemUtils.CurrentConnection);
        bool isValid = false;
        #endregion
        public RegistroComprasDetalle()
        {
            this.InitializeComponent();
        }

        #region Proceso BackGround Carga de Combos
        int intTipoCarga = 0;
        private void BgwLoadDocumentosDoWork(object sender, DoWorkEventArgs e)
        {
            if (this.intTipoCarga == 0)
            {
                e.Result = SystemUtils.RecordManagerCommonList.GetDocument(2);
            }
            if (this.intTipoCarga == 1)
            {
                e.Result = SystemUtils.RecordManagerCommonList.GetMoneda();
            }
            if (this.intTipoCarga == 2)
            {
                e.Result = SystemUtils.RecordManagerCommonList.GetFormaPago("C", true);
            }
            if (this.intTipoCarga == 3)
            {
                e.Result = SystemUtils.RecordManagerCommonList.GetOperaciones();
            }
        }

        private void BgwLoadDocumentosRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (this.intTipoCarga == 3)
            {
                this.CbTipoOperacion.Properties.DataSource = e.Result;
            }
            if (this.intTipoCarga == 2)
            {
                this.CbTipoCompra.Properties.DataSource = e.Result;
                this.intTipoCarga = 3;
                this.BGWLoadDocumentos.RunWorkerAsync();
            }
            if (this.intTipoCarga == 1)
            {
                this.CbMoneda.Properties.DataSource = e.Result;
                this.intTipoCarga = 2;
                this.BGWLoadDocumentos.RunWorkerAsync();
            }
            if (this.intTipoCarga == 0)
            {
                this.CbDocumento.Properties.DataSource = e.Result;
                this.intTipoCarga = 1;
                this.BGWLoadDocumentos.RunWorkerAsync();
            }
        }

        #endregion

        #region Metodos

        private bool ValidarFactura()
        {
            bool result = true;
            if (CbDocumento.EditValue == null)
            {
                result = false;
                SystemUtils.AlerMessaje("Seleccione un Tipo de Documento");
                CbDocumento.Focus();
                return result;
            }

            if ( string.IsNullOrEmpty((string)TxtNumero.EditValue))
            {
                result = false;
                SystemUtils.AlerMessaje("Ingrese el Numero de Serie y Factura");
                TxtSerie.Focus();
                return result;
            }

            if (TxtFecha.EditValue == null)
            {
                result = false;
                SystemUtils.AlerMessaje("Ingrese la Fecha");
                this.TxtFecha.Focus();
                return result;
            }

            if (string.IsNullOrEmpty((string)this.TxtProveedor.EditValue))
            {
                result = false;
                SystemUtils.AlerMessaje("Seleccione un Proveedor");
                return result;
            }
            if (this.TxtIdDireccion.EditValue == null || string.IsNullOrEmpty(this.TxtIdDireccion.EditValue.ToString()))
            {
                result = false;
                SystemUtils.AlerMessaje("No ha seleccionado un Proveedor");
                this.TxtProveedor.Focus();
                return result;
            }

            if (CbTipoCompra.EditValue == null)
            {
                result = false;
                SystemUtils.AlerMessaje("Seleccione el Tipo de Compra");
                CbTipoCompra.Focus();
                return result;
            }

            if (CbTipoOperacion.EditValue == null)
            {
                result = false;
                SystemUtils.AlerMessaje("Seleccione un Tipo de Operacion");
                CbTipoOperacion.Focus();
                return result;
            }

            if (CbMoneda.EditValue == null)
            {
                result = false;
                SystemUtils.AlerMessaje("Seleccione un Tipo de Moneda");
                CbMoneda.Focus();
                return result;
            }

            this.compra.ActualizarPrecios = this.ChkActualiza.Checked;

            this.compra.FechaDocumento = (DateTime)this.TxtFecha.EditValue;

            this.compra.Anio = this.compra.FechaDocumento.Year.ToString();
            this.compra.Descuento = Convert.ToDouble(this.TxtDescuento.EditValue);
            this.compra.FechaRegistro = DateTime.Now.Date;
            this.compra.GenerarLetras = this.ChkGeneraLetras.Checked;
            this.compra.IdCompra = ""/*cuando es editar, el id de la factura*/;

            this.compra.IdDireccionProveedor = (int)this.TxtIdDireccion.EditValue;
            this.compra.IdDocumento = (int)this.CbDocumento.EditValue;
            this.compra.IdFormaPago = 0;/*por implementar*/
            this.compra.IdIgv = 0;/*por implementar*/
            this.compra.IdMes = this.compra.FechaDocumento.Month.ToString();
            this.compra.IdMoneda = (int)this.CbMoneda.EditValue;
            this.compra.IdOperacion = (string)this.CbTipoOperacion.EditValue;
            IEPersona per = SystemUtils.RecordManagerPersona.GetSupplier(this.TxtProveedor.EditValue.ToString(), true);
            if (per != null)
            {
                this.compra.IdProveedor = per.IdPersona;
            }
            this.compra.IdSucursal = 0;
            this.compra.IdUsuarioRegistra = "";
            this.compra.IdUsuarioUpdate = "";
            this.compra.Importe = Convert.ToDouble(this.TxtImporte.EditValue);
            this.compra.ImporteIgv = Convert.ToDouble(this.TxtImporteIGV.EditValue);
            this.compra.ImporteReintegro = Convert.ToDouble(this.TxtReintegro.EditValue);
            this.compra.MercaderiaTransito = this.Chktransito.Checked;

            if (!string.IsNullOrEmpty((string)this.TxtSerie.EditValue))
            {
                this.compra.NumeroDocumento = string.Concat(this.TxtSerie.EditValue, "-", this.TxtNumero.EditValue);
            }
            else
            {
                this.compra.NumeroDocumento = (string)this.TxtNumero.EditValue;
            }
            this.compra.Persepcion = Convert.ToDouble(this.TxtPercepcion.EditValue);
            this.compra.PorcentajeDescuento = Convert.ToDouble(this.TxtPorcentajeDescuento.EditValue);
            this.compra.ReintegroTributario = this.ChkReintegro.Checked;
            this.isValid = true;
            return result;
        }

        private void AddDetalle(int rowHalde)
        {
            if (!this.isValid)
            {
                this.ValidarFactura();
                if (rowHalde > -1)
                {
                    this.compra.RemoveItem((int)this.gridView1.GetRowCellValue(rowHalde, this.gcItem));
                }
                return;
            }

            this.compra.FactorFlete = Convert.ToDouble(this.TxtFlete.EditValue);
            Listados.frmBusquedaProductos f = new Listados.frmBusquedaProductos();
            f.Opcion = 2;
            f.ShowDialog();
            if (f.data != null)
            {
                if (f.data[0] != null)
                {
                    EDetalleCompra det = null;
                    if (rowHalde == -1)
                    {
                        det = new EDetalleCompra();
                        det.Item = this.compra.NextIdDetalle();
                    }
                    else
                    {
                        det = (EDetalleCompra)this.gridView1.GetFocusedRow();
                    }

                    det.Almacen = "";
                    det.IdAlmacen = 1;
                    det.Cantidad = 0.0;

                    det.Descripcion = f.data[1].ToString();
                    det.Descuento = 0.0;
                    //det.EstadoRow = LayerEntity.Common.EnumRowState.Insertar;
                    det.Flete = 0.0;
                    det.IdDireccion = this.compra.IdDireccionProveedor;
                    det.IdLista = Convert.ToInt32(f.data[9].ToString());
                    det.IdLote = "";
                    //det.IdPrecio = Convert.ToInt32(f.data[10].ToString());
                    det.IdProducto = f.data[0].ToString();
                    det.IdProveedor = this.compra.IdProveedor;
                    det.IdSucursal = this.compra.IdSucursal;
                    det.IdUnidad = Convert.ToInt32(f.data[8].ToString());
                    //det.Igv = 0.0;
                    det.NumeroFactura = this.compra.NumeroDocumento;
                    det.Peso = 0.0;
                    //det.PorcentajeDescuento = 0.0;
                    det.PorcentajeIgv = 0.0;
                    //det.Precio = 0.0;
                    det.SubTotal = 0.0;
                    det.SubTotalSinIgv = 0.0;
                    det.Unidad = f.data[11].ToString();
                    this.compra.AddItem(det);
                    //compra.UpdateFlete(Convert.ToDouble(TxtFlete.EditValue), EnumTipoFlete.Peso);
                }
            }
        }

        private void NuevaFactura()
        {
            this.compra = new ECompra();
            this.compra.UpdateList += new ECompra.RefreshList(ActualizarLista);
            this.ActualizarLista();
            this.TxtSerie.EditValue = string.Empty;
            this.TxtNumero.EditValue = string.Empty;
            this.TxtOrden.EditValue = string.Empty;
            this.TxtGuia.EditValue = string.Empty;
            this.TxtGuiaTransporte.EditValue = string.Empty;
            this.TxtFacturaTransporte.EditValue = string.Empty;
            this.TxtTipoCambio.EditValue = decimal.Zero;
            this.TxtFecha.EditValue = DateTime.Now .Date ;
            this.TxtImporte.EditValue = decimal.Zero;
            this.TxtFlete.EditValue = decimal.Zero;
            this.ChkActualiza.Checked = this.ChkGeneraLetras.Checked = this.ChkReintegro.Checked = this.Chktransito.Checked = false;
            this.isValid = false;
        }

        private void ActualizarLista()
        {
            if (this.TxtFlete.EditValue != null)
            {
                this.compra.UpdateFlete(Convert.ToDouble(this.TxtFlete.EditValue), EnumTipoFlete.Peso);
            }
            else
            {
                this.compra.UpdateFlete(0, EnumTipoFlete.Peso);
            }
            //lista = compra.GetDetalle();
            this.GcDetalle.DataSource = this.compra.GetDetalle();
            this.GcDetalle.RefreshDataSource();
            this.TxtExonerado.EditValue = this.compra.GetExonerado();
            this.TxtImpBruto.EditValue = this.compra.GetTotal();
            this.TxtAfectoIgv.EditValue = this.compra.GetAfecto();
            this.TxtIgv.EditValue = this.compra.GetIgv();
            this.TxtDescuento.EditValue = this.compra.GetDescuento();
            this.TxtPorcentajeDescuento.EditValue = this.compra.GetPorcentajeDescuento();

            this.TxtFactor.EditValue = this.compra.FactorFlete;
            this.gridView1.MoveLast();
        }

        #endregion

        private void RegistroComprasDetalle_Load(object sender, EventArgs e)
        {
            this.BGWLoadDocumentos.RunWorkerAsync();

            this.CbFlete.Properties.DataSource = this.compras.GetTiposFlete();
            this.NuevaFactura();
        }

        private void TxtDescripcion_ButtonClick(object sender, DevExpress.XtraEditors.Controls.ButtonPressedEventArgs e)
        {
            Persona.BuscarPersona b = new System2012.Persona.BuscarPersona(LayerEntity.Persona.EnumTipoPersona.Proveedor);
            b.ShowDialog();
            if (b.Estado)
            {
                IEPersona per = b.Persona;
                this.TxtProveedor.EditValue = per.NumeroDocumento ;
                this.TxtDescripcion.EditValue = per.RazonSocial;
                EDireccion dir = per.GetAddress(b.IdAddressSelected);
                if (dir != null)
                {
                    this.TxtIdDireccion.EditValue = dir.Item;
                    this.TxtDireccion.EditValue = dir.Direccion;
                    LayerEntity.Sistema.EUbigeo ubi = SystemUtils.RecordManagerCommonList.GetUbigeoByUbigeo(dir.Ubigeo);
                    if (ubi != null)
                    {
                        this.TxtUbigeo.EditValue = string.Concat(ubi.Ubigeo, "=>", ubi.ToString());
                    }
                }
            }
        }

        private void BarManager1ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            if (e.Item.Tag.ToString() == "Imprimir")
            { 
            }
            if (e.Item.Tag.ToString() == "Anular")
            {
            }
            if (e.Item.Tag.ToString() == "Guardar")
            {

                if (isValid) {
                    compras.RegistrarCompra(compra);
                }
            }
            if (e.Item.Tag.ToString() == "Nuevo")
            {
                if (SystemUtils.Question("Esta Seguro de Generar Otra Factura", this.Text) == DialogResult.Yes)
                {
                    this.NuevaFactura();
                }
            }
        }

        private void BarManager2ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            if (e.Item.Tag.ToString() == "Agrega")
            {
                this.AddDetalle(-1);
            }
            if (e.Item.Tag.ToString() == "Quitar")
            {
                compra.RemoveItem(Convert.ToInt32(gridView1.GetRowCellValue(gridView1.FocusedRowHandle, gcItem)));
            }
        }

        private void GridView1CellValueChanged(object sender, DevExpress.XtraGrid.Views.Base.CellValueChangedEventArgs e)
        {
            if (e.Column == this.gcIdProducto)
            {
                EProducto p = this.pro.GetProducto(e.Value.ToString());
                if (p == null)
                {
                    this.AddDetalle(e.RowHandle);
                }
                else
                { 
                    int id = Convert.ToInt32(gridView1.GetRowCellValue(e.RowHandle, gcItem));
                    EDetalleCompra c = compra.GetItem(id);
                    if (c != null)
                    {
                        c.Descripcion = p.descripcion;
                        c.IdProducto = p.id_producto; 
                        compra.AddItem(c);
                    }
                }
            }
            if (e.Column == gcAlmacen)
            { 
                int id = 0;
                int.TryParse(e.Value.ToString(), out id);
                EAlmacen al = SystemUtils.RecordmanagerAlmacen.GetAlmacen(id);

                EDetalleCompra dc = compra.GetItem(Convert.ToInt32(gridView1.GetRowCellValue(e.RowHandle, gcItem)));
                if (al == null) {
                    Almacen.Consultas.BuscarAlmacen alm = new System2012.Almacen.Consultas.BuscarAlmacen();
                    alm.ShowDialog();
                    if (alm.Estado)
                    {
                        al = alm.Almacen;
                    }
                }
                if (al != null) {
                    dc.IdAlmacen = al.Id_Almacen;
                    dc.Almacen = al.Des_almacen;
                    compra.AddItem(dc);
                }

            }
            
            this.ActualizarLista();
        }
       

        private void BtAgrega_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
        }
    }
}